package com.liyong.pullorder.sdk.client.auth;

import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpHeaders;

import java.util.Map;

/**
 * @author 葡萄味的萝卜
 * @date 2025/10/21 12:13
 * API Key认证策略实现
 * 应用平台：网店管家ERP、华盛、浙江移动等采用API Key认证的系统
 * 灵活性：支持Header传参、Query参数等多种传递方式
 *
 * 配置示例：
 * auth:
 *   type: API_KEY
 *   config:
 *     apiKey: "your_api_key_123"
 *     headerName: "X-API-Key"  # 可选，默认为X-API-Key
 */
@Slf4j
public class ApiKeyStrategy implements AuthStrategy{
    @Override
    public String getType() {
        return "API_KEY";
    }

    @Override
    public boolean supports(String authType) {
        return "API_KEY".equalsIgnoreCase(authType);
    }

    /**
     * 应用API Key认证到请求头
     * 支持多种传递方式：
     * 1. Header方式（默认）：X-API-Key: your_key
     * 2. Query参数方式：api_key=your_key（通过配置指定）
     */
    @Override
    public void applyAuth(HttpHeaders headers, Map<String, String> authConfig) {
        String apiKey = authConfig.get("apiKey");
        if (apiKey == null || apiKey.trim().isEmpty()) {
            throw new IllegalArgumentException("API Key配置不能为空");
        }

        String headerName = authConfig.getOrDefault("headerName", "X-API-Key");
        headers.set(headerName, apiKey);

        log.debug("应用API Key认证 - Header: {} = {}", headerName,
                maskSensitiveInfo(apiKey)); // 敏感信息脱敏
    }

    /**
     * API Key脱敏显示
     * 安全要求：日志中不输出完整的敏感信息
     */
    private String maskSensitiveInfo(String apiKey) {
        if (apiKey.length() <= 8) {
            return "***";
        }
        return apiKey.substring(0, 4) + "***" + apiKey.substring(apiKey.length() - 4);
    }
}
